class Solution {
public:
    void _flatten(TreeNode* root)
    {
        if(root == nullptr)
        {
            return;
        }
        _flatten(root->left);//处理该节点的左子树，让其变成一个链表
        _flatten(root->right);//处理该节点的右子树，让其变成一个链表
        if(root->left)
        {
            //找到root节点左子链表的最右节点
            //将其链接到右子链表中
            TreeNode* cur = root->left;
            while(cur->right)
            {
                cur = cur->right;
            }
            //到这里cur中就是root左子树中的最右节点
            cur->right = root->right;
            root->right = root->left;
            root->left = nullptr;
        }//该节点的左子树不为空
        return;
    }//这个函数的目的就是找到
    void flatten(TreeNode* root) {
        //后序遍历，在遍历节点的时候，判断当前这个节点的左孩子是否为空，不为空就找到当前节点
        //左字树的最右节点，将这个最右节点的right指针指向当前节点的右子树，然后将我这个当前节点的右指针指向
        //这个节点的左孩子,继续去进行遍历，这样就能够解决这道题目。
        return _flatten(root);
    }
};